//
// Created by zephyrus on 2024/6/19.
//
#include "staticlist.h"

/**
 * 初始化
 * @param space
 */
void InitStaticList(StaticList *space)
{
    //初始化备用空间pool(即下标1~MAX_SIZE-1)，其中下标为1的空间是备用空间的头结点，用于指向可使用的备用空间
    for (int i = 1; i < MAX_SIZE - 1; ++i)
    {
        //备用区每个空间的游标指向下一个空间
        space[i]->cur = i + 1;
    }
    //备用区的最后一个空间，后无可以空间，游标为0s
    space[MAX_SIZE - 1]->cur = 0;
    //初始化时为空的静态链表，无数据结点，头结点的游标为-1
    space[0]->cur = -1;
}

/**
 * 申请空间
 * @param space
 * @return
 */
int StaticList_malloc(StaticList *space)
{
    int i = space[1]->cur;
    //如果备用区中还有可用空间那么就进行分配（更改备用区头指针的指向）
    if (space[1]->cur != 0)
    {
        space[1]->cur = space[i]->cur;
    }
    return i;

}

/**
 * 打印
 * @param space
 */
void StaticList_show(StaticList *space)
{
    int i = space[0]->cur;
    while (i != -1)
    {
        printf("%c-->", space[i]->data);
        i = space[i]->cur;
    }
    printf("Nul. \n");
}

/**
 * 头插入法
 * @param space
 * @param x
 */
void StaticList_insert(StaticList *space, ElemType x)
{
    int i = StaticList_malloc(space);
    if (i == 0)
    {
        printf("application for space failed . \n");
        return;
    }
    space[i]->data = x;
    if (space[0]->cur == -1)
    {
        space[i]->cur = -1;
    } else
    {
        space[i]->cur = space[0]->cur;
    }
    space[0]->cur = i;
}

/**
 * 头删
 * @param space
 */
void StaticList_delete(StaticList *space)
{
    int i = space[0]->cur;
    space[0]->cur = space[i]->cur;
    StaticList_free(space, i);

}

/**
 *释放
 * @param sapce
 * @param k
 */
void StaticList_free(StaticList *space, int k)
{
    space[k]->cur = space[1]->cur;
    space[1]->cur = k;
}